<?php
/**
 * == UI ==
 *
 * Cette section détaille les classes et méthodes à utiliser pour la création d'interface pour l'application mobile C2E phone.
 **/
 
/** section: UI
 * UI
 * Gestion des éléments de l'interface graphique pour mobile.
 **/
class UI{
/**
 * UI.tabControl_instance -> TabControl
 * Instance du TabControl.
 **/
	public $tabControl_instance;
/**
 * UI.TabControl() -> TabControl
 *
 * Créer une nouvelle instance de TabControl ou retourne l'instance du TabControl (Singleton).
 **/
	final static public function TabControl(){
		global $UI;
		if($UI->tabControl_instance instanceof TabControl){
			return 	$UI->tabControl_instance;
		}
		return new TabControl();
	}
/**
 * UI.Header() -> void
 *
 * Cette méthode affiche l'entête du document HTML. Elle inclut les scripts et règles CSS pour le lancement de l'interface mobile.
 **/
	final static public function Header($link = ""){
		?> 
       		<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
			<meta name="viewport" content="initial-scale=1.0, user-scalable=no" />

            <link rel="stylesheet" href="<?php echo $link; ?>themes/icons/icons.css.php" />
            <link rel="stylesheet" href="<?php echo $link; ?>themes/touchwin/touchwin.css.php" />
            <script src="<?php echo $link; ?>js/prototype/prototype.js"></script>
            <script src="<?php echo $link; ?>js/jquery/jquery.js"></script>
            <script type="text/javascript" src="<?php echo $link; ?>js/touchwin/extends.js?lang=fr"></script>
            <script src="<?php echo $link; ?>js/jquery/jquerymobile.js"></script>
            <script src="<?php echo $link; ?>js/core/system.js"></script>
           	<script src="<?php echo $link; ?>js/touchwin/touchwin.tabcontrol.js"></script>
			<script src="<?php echo $link; ?>js/touchwin/touchwin.simpletable.js"></script>
			<script src="<?php echo $link; ?>js/touchwin/touchwin.menu.js"></script>
       <?php
	}
/**
 * UI.Body() -> void
 * 
 * Cette méthode affiche le corps de l'application Mobile.
 **/
	final static public function Body(){
		global $UI;
		echo $UI->TabControl();
	}
/**
 * UI.Location(link [, title]) -> String
 *
 * Cette méthode permet de créer des liens vers une page de l'application mobile.
 **/
	final static function Location($string, $title = ''){
		if($string == "") return '';
		//$uri = explode('/', $_SERVER['PHP_SELF']);
		//$uri = str_replace($uri[count($uri) - 1], '', $_SERVER['PHP_SELF']);
		//$uri = 'http://'.$_SERVER['SERVER_NAME'].$uri;												 
		
		return '<a href="'.addslashes($string).'">' . $title . '</a>';
	}
	
}
$UI = new UI;
/** section: UI
 * class TabControl
 * Cette classe créer un gestionnaire d'onglet et de panneaux.
 **/
class TabControl{
/**
 * TabControl.className -> String
 * Classe CSS de l'instance.
 **/
	public $className = '';
/**
 * TabControl.id -> String
 * Classe ID de l'instance.
 **/
	public $id =		'tabcontrol';
/**
 * TabControl.backLink -> String
 * Lien cible du bouton.
 **/
	private $backLink =		'';
/**
 * TabControl.panels -> Array
 * Tableau des panneaux.
 **/	
	private $panels =	array();
/**
 * TabControl.menus -> Array
 * Tableau des menus.
 **/	
	private $menus =	array();
/**
 * TabControl.childs -> Array
 * Tableau des éléments enfants.
 **/	
	private $childs =	array();
/**
 * new TabControl()
 * 
 * Créer une nouvelle instance du gestionnaire d'onglet [[TabControl]].
 **/
	function __construct(){
		global $UI;
		$UI->tabControl_instance = $this;
	}
/**
 * TabControl.addPanel(title, panel, icon) -> void
 * - title (String): Titre du panneau.
 * - panel (Panel): Instance Panel.
 * - icon (String): Nom de l'icône à afficher.
 *
 * Ajoute un panneau à gestionnaire d'onglet.
 **/	
	final public function addPanel($title, Panel $panel, $icon){
		array_push($this->panels, array('title'=>$title, 'panel'=>$panel, 'icon'=>$icon));
	}
/**
 * TabControl.child(title, panel) -> void
 *
 * Ajoute un panneau à gestionnaire d'onglet.
 **/	
	final public function addChild($child){
		array_push($this->childs, $child);
	}
/**
 * TabControl.addMenu(menu) -> void
 *
 * Ajoute un menu au gestionnaire d'onglet.
 **/	
	final public function addMenu(PopupMenu $menu){
		$menu->setId(count($this->menus));
		array_push($this->menus, $menu);
	}
/**
 * TabControl.BackButton([link]) -> void
 * - link (String): Lien de la page cible de retour.
 *
 * Si le paramètre `link` est définit le bouton de retour sera affiché à l'écran.
 **/
 	final public function BackButton($link = ''){
		$this->backLink = $link;	
	}
/**
 * TabControl.toString() -> String
 *
 * Convertie l'instance en chaine de caractère HTML.
 **/
 	final public function __toString(){
		$panelHTML = '';
		$string = '
		<div class="tab-control '.$this->className.'">
			<div class="header" role="header">';
			
		//génération des boutons du gestionnaire d'onglet.	
			
		if($this->backLink != ''){
			$back = new Button('Retour', 'back');
			$back->Link = $this->backLink;
			$string .= $back;
		}
			
		for($i = 0; $i < count($this->menus); $i++){
			$menu = $this->menus[$i];
			$string .= $menu->Button;
		}
		
		for($i = 0; $i < count($this->panels); $i++){
			$panel = $this->panels[$i];
			
			$button = 				new LargeButton($panel['title'], $panel['icon']);
			$button->id = 			'onglet-'.$i;
			$panel['panel']->id = 	$i;
			$panelHTML .= 			$panel['panel'];
			$string .= 				$button;
		}
		
		
		$string .='
			</div>
			<div class="body" role="body">
				<div class="carroussel" style="width:'.(count($this->panels) * 320).'">
					'.$panelHTML.'
				</div>';
		
		//ajout des élements externe
		for($i = 0; $i < count($this->menus); $i++){
			$menu = 	$this->menus[$i];
			$string .= 	$menu->Popup;
		}
		
		$string .= '
			</div>
		</div>';
		
		return $string;
	}
}
/** section: UI
 * class Panel
 * Cette classe permet de créer un conteneur d'élément pour le gestionnaire [[TabControl]].
 **/
class Panel{
/**
 * Panel.id -> String
 * ID de l'instance.
 **/	
	public $id = '';
/**
 * Panel.childs -> Array
 * Liste des enfants du conteneur Panel.
 **/
 	private $childs = array();
/**
 * new Panel()
 *
 * Créer une nouveau de conteneur d'élément [[Panel]].
 **/
	function __construct(){}
/**
 * Panel.addChild(child) -> void 
 * - child (String | Object): Element à ajouter au panneau.
 * 
 * Cette méthode permet l'ajout d'élément HTML au panneau. C'est dernier sera affiché dans l'instance.
 *
 * <p class="note">Cette méthode accèpte tout type d'objet possèdent une méthode `__toString`</p>
 **/
 	final public function addChild($child){
		array_push($this->childs, $child);
	}
/**
 * Panel.toString() -> String
 *
 * Convertie l'instance en chaine de caractère HTML.
 **/
 	final public function __toString(){
		$string = '
			<div class="panel" id="panel-'.$this->id.'">';
			
		for($i = 0; $i < count($this->childs); $i++){
			$string .= $this->childs[$i];	
		}
		$string .='
			</div>';
		return $string;
	}
}
/** section: UI
 * class Button
 * Cette créer une bouton avec du texte.
 **/
class Button{
	public $className ='';
/**
 * Button.id -> String
 * Id de l'instance.
 **/
	public $id = 		'';
/**
 * Button.Text -> String
 * Texte du bouton.
 **/
	public $Text =		'';
/**
 * Button.Type -> String
 * Type du bouton (normal ou back).
 **/
	public $Type =		'normal';
/**
 * Button.Link -> String
 * Lien de la page cible.
 **/
 	public $Link =		'#';
/**
 * new Button([text [, type]])
 *
 * Créer une nouvelle instance de bouton simple.
 **/
	function __construct($text = '', $type = 'normal'){
		$this->Text = $text;
		$this->Type = $type;
	}
/**
 * Button.__toString() -> String
 *
 * Convertie l'instance en chaine de caractère HTML.
 **/
 	final function __toString(){
		$string = '';
		if($this->Type == 'back'){
			$string = '<span class="button back-button" id="button-'.$this->id.'"><div class="back-f"></div>'.UI::Location($this->Link, $this->Text).'</span>';
		}else{
			$string = '<span class="button '. $this->className.'" id="button-'. $this->id .'">'.UI::Location($this->Link, $this->Text).'</span>';
		}
		return $string;
	}
}
/** section: UI
 * class PopupMenu
 * Cette classe permet de créer un menu qui s'affichera par dessus le contenu de l'application mobile.
 **/
class PopupMenu{
/**
 * PopupMenu.id -> String
 * Identifiant du menu.
 **/
	private $id = '';
/**
 * PopupMenu.Popup -> Popup
 * Instance popup du menu contenant les liens.
 **/
	public $Popup;
/**
 * PopupMenu.Button -> Button
 * Instance bouton du menu.
 **/
	public $Button;
/**
 * new PopupMenu()
 * 
 * Créer une nouvelle instance de gestionnaire de menu.
 **/
	function __construct(){
		$this->Popup = 	new Popup();
		$this->Button = new Button();
		$this->Button->className = 'button-menu'; 
	}
/**
 * PopupMenu.addLink(link, text, icon) -> void
 * - link (String): Lien cible de la page.
 * - text (String): Texte à afficher pour le bouton.
 * - icon (String): Classe CSS de l'icône.
 *
 * Cette méthode ajoute un nouveau lien de type [[AppButton]] au gestionnaire de menu.
 **/
	final function addLink($link, $name, $icon){
		array_push(new AppButton($link, $name, $icon));
	}
/**
 * PopupMenu.setID(id) -> void
 * - id (String): Identifiant HTML unique.
 *
 * Cette méthode assigne un ID à l'instance.
 **/
	final function setID($id){
		$this->Popup->id = 	$id;
		$this->Button->id = $id;	
	}
}
/** section: UI
 * class Popup
 * Cette classe créer un popup déroulant. Elle est associé à l'instance [[PopupMenu]] afin de créer un menu principal
 * pour l'application mobile.
 *
 * Le popup s'affichera par dessus le contenu et contiendra une collection d'instance [[AppButton]].
 **/
class Popup{
/**
 * Popup.id -> String
 * Identifiant du Popup.
 **/
	public $id = '';
/**
 * Popup.childs -> array
 * Liste des éléments enfants.
 **/
	private $childs = array();
/**
 * new Popup()
 *
 * Créer une nouvelle instance de [[Popup]].
 **/
	function __construct(){}
/**
 * Popup.addChild() -> void 
 *
 * Ajoute un élément enfant à l'instance.
 **/
 	final public function addChild($child){
		array_push($this->childs, $child);
	}
/**
 * Popup.toString() -> String
 *
 * Convertie l'instance en chaine de caractère HTML.
 **/
 	function __toString(){
		$string = '<div class="popup" id="popup-'.$this->id.'">';
		
		for($i = 0; $i < count($this->childs); $i++){
			$string .= $this->childs[$i];	
		}
		
		$string .= '</div>';
		return $string;
	}
}
/** section: UI
 * class AppButton
 * Cette classe créer un bouton avec une icône au format 48x48. Elle est à utiliser avec
 * une instance [[PopupMenu]] pour créer un menu proche graphiquement de celui d'un iPhone.
 * 
 * La classe prend en charge un lien vers une page cible afin de rediriger l'utilisateur vers cette dernière.
 **/
class AppButton{
/**
 * AppButton.id -> String
 * Identifiant du bouton.
 **/
	public $id = 	'';
/**
 * AppButton.Icon -> String
 * Icône du bouton.
 **/
	public $Icon =	'';
/**
 * AppButton.Text -> String
 * Texte du bouton.
 **/
	public $Text =	'';
/**
 * AppButton.Link -> String
 * Lien de la page cible.
 **/
	public $Link =	'';
/**
 * new AppButton([link [, text [, icon]]])
 * - link (String): Lien de la page cible.
 * - text (String): Texte à afficher pour le bouton.
 * - icon (String): Classe CSS de l'icône.
 *
 * Créer un nouveau bouton avec une icône au format 48x48 et un texte.
 **/
	function __construct($link = '', $text = '', $icon = ''){
		$this->Link = $link;
		$this->Text = $text;
		$this->Icon = $icon;
	}
/**
 * AppButton.toString() -> String
 *
 * Cette méthode convertie l'instance en chaine de caractère HTML.
 **/	
	final function __toString(){
		$string = '
			<span class="app-button">
                <div class="content-icon-button">
                	<div class="icon icon-'.$this->Icon.'">
                    </div>
                    <div class="mask-button">
                    </div>
                </div>
                <div class="app-text">'.UI::Location($this->Link, $this->Text).'</div>
            </span>';
		return $string;
	}
}
/** section: UI
 * class LargeButton
 * Cette classe est un composant d'une instance [[TabControl]]. Il permet de créer un onglet avec une icône associé à un panneau [[Panel]].
 **/
class LargeButton{
/**
 * LargeButton.id -> String
 * Identifiant du bouton.
 **/
	public $id = 	'';
/**
 * LargeButton.Icon -> String
 * Icône du bouton.
 **/
	public $Icon =	'';
/**
 * LargeButton.Text -> String
 * Texte du bouton.
 **/
	public $Text =	'';
/**
 * new LargeButton([text [, icon]])
 * - text (String): Texte à afficher en dessous de l'icône.
 * - icon (String): Classe CSS de l'icône.
 *
 * Créer un nouveau bouton avec une icône au format 28x28 et un texte.
 **/
	function __construct($text = '', $icon = ''){
		$this->Text = $text;
		$this->Icon = $icon;
	}
/**
 * LargeButton.toString() -> String
 *
 * Cette méthode convertie l'instance en chaine de caractère HTML.
 **/	
	final function __toString(){
		$string = '
		<span class="large-button" id="large-button-'.$this->id.'">
        	<div class="icon icon-'.$this->Icon.'"></div>
            <div class="text-button">'.$this->Text.'</div>
        </span>';
		
		return $string;
	}
}
/** section: UI
 * class IconButton
 * Cette classe créer un bouton avec icône au format 32x32 sans texte.
 **/
class IconButton{
/**
 * IconButton.Icon -> String
 * Icône du bouton.
 **/
	public $Icon =	'';
/**
 * IconButton.Link -> String
 * Lien de la page cible.
 **/
	public $Link =	'';
/**
 * new IconButton([link [, icon]])
 * - link (String): Lien de la page cible.
 * - icon (String): Classe CSS de l'icône.
 * 
 * Créer une nouvelle instance d'[[IconButton]].
 **/
	function __construct($link = '', $icon = ''){
		$this->Icon = $icon;
		$this->Link = $link;
	}
/**
 * IconButton.toString() -> String
 *
 * Convertie l'instance en chaine de caractère HTML.
 **/
 	final function __toString(){
		 return '<span class="icon-button icon-'.$this->Icon.'" >'.UI::Location($this->Link).'</span>';
	}
}
/** section: UI
 * class SplitIcon
 * Cette classe permet de créer un titre avec une icône à droite du titre.
 **/
class SplitIcon{
/**
 * SplitIcon.Title -> String
 * Titre à afficher.
 **/
	public $Title = '';
/**
 * SplitIcon.Icon -> String
 * Icône associé au titre.
 **/
	public $Icon =	'';
/**
 * new SplitIcon([title[, icon]])
 *
 * Créer une nouvelle instance de [[SplitIcon]].
 **/
	function __construct($title = '', $icon = ''){
		$this->Icon = 	$icon;
		$this->Title = 	$title;
	}
/**
 * SplitIcon.toString() -> String
 *
 * Cette méthode convertie l'instance en chaine de caractère HTML.
 **/
	final public function __toString(){
		return '<h2 class="split-icon icon-'.$this->Icon.'">'.$this->Title.'</h2>';	
	}
}
/** section: UI
 * class SimpleTable
 * Cette classe permet de gérer l'affiche de donnée sous forme de tableau.
 **/
class SimpleTable{
/**
 * SimpleTable.id -> String
 * Identifiant du bouton.
 **/
	public $id = 	'';
/**
 * SimpleTable.Link -> String
 * Lien de la page cible.
 **/
	public $Link =	'';
		
	private $Header;
	private $Array;
/**
 * new SimpleTable(link [, header [, data]])
 * - link (String): Lien de la page qui sera appellé lors d'un clique sur l'une des lignes du tableau.
 * - header (Array): Entête de configuration de l'instance.
 * - data (Array): Tableau de données à afficher.
 * 
 * Créer une nouvelle instance de [[SimpleTable]].
 **/
	function __construct($link = NULL, $header = NULL, $table = NULL){
		$this->Link = $link;
		
		if(is_array($header)) $this->addHeader($header);
		if(is_array($table)) $this->addRows($table);
	}
/**
 * SimpleTable.addHeader(header) -> String
 * - header (Array): Tableau d'entete.
 *
 * Cette méthode ajoute une entête permettant le traitement des données via [[SimpleTable.addRows]].
 *
 * #### Structure du paramètre header
 *
 * La structure de l'entête doit etre la suivante :
 *
 * * Indice 0 : Numéro d'identifiant des données. Cet ID sera transmise à la page enregistré dans [[SimpleTable.Link]] lors du clique sur l'une des lignes du tableau.
 * * Indice 1 : Titre principale de la ligne.
 * * Indice 2 : Sous-titre de la ligne.
 *
 **/
	final public function addHeader($header){
		$this->Header = $header;
	}
/**
 * SimpleTable.addRows(array) -> void
 * - array (Array): Tableau de données.
 * 
 * Cette méthode enregistre un tableau de données afin d'être affiché par l'instance [[SimpleTable]] à l'écran.
 *
 * #### Exemple
 *
 * Cette exemple affiche un tableau à deux lignes avec un numéro d'identifiant `Event_ID`, un titre `Titre` et un sous-titre `Conferencier` :
 *
 *     $st = new SimpleTable('page_event.php');
 *     $st.addHeader(array('Event_ID', 'Titre', 'Conferencier'));
 *     $st.addRows(array(
 *         array('Event_ID' => 1, 'Titre' => 'Projet SOS 21',   'Conferencier' => 'avec : Mr PLANCHON Frédéric '),
 *         array('Event_ID' => 2, 'Titre' => 'Mon Titre 2',   'Conferencier' => 'Avec Blabla'),
 *     );
 *
 **/
	final public function addRows($table){
		$this->Array = $table;
	}
/**
 * SimpleTable.toString() -> String
 *
 * Cette méthode convertie l'instance en chaine de caractère HTML.
 **/	
	final function __toString(){

		$string = '<div class="simple-table">';
				
		foreach($this->Array as $row){
			if(!is_array($row)) continue;	
			
			if(empty($row[$this->Header[0]])) {
				$line = 	'<div class="st-line no-link">';
				$line .= 	'<h1>'.$row[$this->Header[1]].'</h1>';
			}else{
				$line = 	'<div class="st-line linkable">';
				$line .= 	'<h1>'.UI::Location($this->Link . '?ID=' . @$row[$this->Header[0]], $row[$this->Header[1]]).'</h1>';
			}
			
			if(!empty($row[$this->Header[2]])){
				$line .= 	'<p>' . $row[$this->Header[2]] . '</p>';
			}
			$line .= 	'</div>';
			$string .= 	$line; 
		}
		$string .= '</div>';

		return $string;
	}
}
/** section: UI
 * class Galery
 * Cette classe permet de gérer l'affichage des médias.
 **/
class Galery{
/**
 * Galery.id -> String
 * Identifiant du bouton.
 **/
	public $id = 	'';		
	private $Header;
	private $Array;
/**
 * new Galery([header [, data]])
 * - link (String): Lien de la page qui sera appellé lors d'un clique sur l'une des lignes du tableau.
 * - header (Array): Entête de configuration de l'instance.
 * - data (Array): Tableau de données à afficher.
 * 
 * Créer une nouvelle instance de [[SimpleTable]].
 **/
	function __construct($header = NULL, $table = NULL){
		if(is_array($header)) $this->addHeader($header);
		if(is_array($table)) $this->addRows($table);
	}
/**
 * Galery.addHeader(header) -> String
 * - header (Array): Tableau d'entete.
 *
 * Cette méthode ajoute une entête permettant le traitement des données via [[Galery.addRows]].
 *
 * #### Structure du paramètre header
 *
 * La structure de l'entête doit etre la suivante :
 *
 * * Indice 0 : Lien du document
 * * Indice 1 : Titre principale de la ligne.
 * * Indice 2 : Sous-titre de la ligne.
 *
 **/
	final public function addHeader($header){
		$this->Header = $header;
	}
/**
 * Galery.addRows(array) -> void
 * - array (Array): Tableau de données.
 * 
 * Cette méthode enregistre un tableau de données afin d'être affiché par l'instance [[Galery]] à l'écran.
 *
 * #### Exemple
 *
 * Cette exemple affiche un tableau à deux lignes avec un numéro d'identifiant `Event_ID`, un titre `Titre` et un sous-titre `Conferencier` :
 *
 *     $st = new SimpleTable('page_event.php');
 *     $st.addHeader(array('Link', 'Title'));
 *     $st.addRows(array(
 *         array('Link' => 'http://localhost/galeries/media1.png', 'Title' => 'Conférence 1'), 
 *         array('Link' => 'http://localhost/galeries/media2.png', 'Title' => 'Conférence 2')
 *     );
 *
 **/
	final public function addRows($table){
		$this->Array = $table;
	}
/**
 * SimpleTable.toString() -> String
 *
 * Cette méthode convertie l'instance en chaine de caractère HTML.
 **/	
	final function __toString(){

		$string = '<div class="galery">';
				
		foreach($this->Array as $row){
			if(!is_array($row)) continue;	
			$img = '';
			$line = 	'<div class="media">';
			switch(Stream::Extension($row[$this->Header[0]])){
				case 'jpg':
				case 'png':
				case 'gif':
					$img = '<img src="'.$row[$this->Header[0]].'" alt="'.$row[$this->Header[1]].'" />';
					break;
				case 'pdf':
					$line = '<div class="media-icon">';
					$img = '<img src="themes/icons/all/pdf.png" alt="'.$row[$this->Header[1]].'" /><h3>'.$row[$this->Header[1]].'</h3>';
					break;
				case 'docx':
				case 'doc':
					$line = '<div class="media-icon">';
					$img = '<img src="themes/icons/all/word.png" alt="'.$row[$this->Header[1]].'" /><h3>'.$row[$this->Header[1]].'</h3>';
					break;
				case 'xlsx':
				case 'xls':
					$line = '<div class="media-icon">';
					$img = '<img src="themes/icons/all/xls.png" alt="'.$row[$this->Header[1]].'" /><h3>'.$row[$this->Header[1]].'</h3>';
					break;
				case 'ppt':
				case 'pps':
					$line = '<div class="media-icon">';
					$img = '<img src="themes/icons/all/pps.png" alt="'.$row[$this->Header[1]].'" /><h3>'.$row[$this->Header[1]].'</h3>';
					break;
				default:break;
			}
			
			
			$line .= 	UI::Location(@$row[$this->Header[0]], $img);
			$line .= 	'</div>';
			$string .= 	$line; 
		}
		$string .= '</div>';

		return $string;
	}
}

?>